package com.lqian.list;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Vector;

/**
 * 1.Vector 的底层也是一个Object数组
 * protected Object[] elementData;
 *
 *2.Vector是线程同步的，即线程安全，Vector类的操作方法带有synchronized
 * public synchronized boolean add(E e) {
 *         modCount++;
 *         ensureCapacityHelper(elementCount + 1);
 *         elementData[elementCount++] = e;
 *         return true;
 *     }
 *
 *3.在开发中如果需要考虑线程安全时，可以考虑使用Vector
 *
 * @Author Melody_LQ
 * @Date 2021/6/22 18:01
 * @Description This is description of class
 * @Since version-1.0
 */
public class VectorSource {
    public static void main(String[] args) {
        //和ArrayList很类似
        Vector vector = new Vector();

        List  list = new ArrayList();
        Collections.synchronizedList(list);

        /*
        *     public static <T> List<T> synchronizedList(List<T> list) {
                return (list instanceof RandomAccess ?
                new SynchronizedRandomAccessList<>(list) :
                new SynchronizedList<>(list));
    }
        public E get(int index) {
            synchronized (mutex) {return list.get(index);}
        }
        public E set(int index, E element) {
            synchronized (mutex) {return list.set(index, element);}
        }
        public void add(int index, E element) {
            synchronized (mutex) {list.add(index, element);}
        }
        public E remove(int index) {
            synchronized (mutex) {return list.remove(index);}
        }

        * */
    }

    /**
     * Vector和ArrayList很类似，
     * 但Vector有点过时了？why？ 基本上每一个操作方法都加有synchronized，比如get/set/add
     * 针对性能来说会有比较大的影响，慢慢就被弃用了
     *
     * ArrayList不是线程安全的，但是你如果想让它线程安全
     * 可以用Collections.synchronizedList(list);进行转换包装
     * 可以增加代码的灵活度，在我们原有的代码上进行了同步代码块的包装，可以在我们需要的时候就通过它重写的代码实现
     *
     *
     * 都是以动态数组来存储数据的，是线程安全的
     * */
}
